package com.cpimex.eprice;

import java.util.ArrayList;
import java.sql.*;
import java.util.*;
import com.cpimex.eprice.bean.EstatusBean;
import com.cpimex.eprice.bean.EstatusNva;
import com.cpimex.eprice.usuarios.Usuario;

public class Estatus {
	
	private static final boolean DEBUG = false;
    private final String EDITAR = "editEstatus";
    private final String ELIMINAR = "deleteEstatus";

    /**
     * 
     * @param int_accion
     * @param str_perfil
     * @param bol_director
     * @param bol_VPO
     * @return
     */
    public static String codigoStatusSiguiente( int int_accion, String str_perfil, boolean bol_director, boolean bol_VPO ){
    	
    	String str_estatus = "";
        
        if(str_perfil.equals(Usuario.ADMINISTRADOR)){
        	if (int_accion == 1) str_estatus = "RCHZ-GTE";
             else{
                 str_estatus = "AUTORIZADA";
             } 
        }
        if (str_perfil.equals(Usuario.GERENTE) || str_perfil.equals(Usuario.RESPONABLEGERENCIA)) {
            if (int_accion == 1) str_estatus = "RCHZ-GTE";
            else if (!bol_director) {
                str_estatus = "AUTORIZADA";
            } else {
                str_estatus = "PENDIR";
            }
        } else if (str_perfil.equals(Usuario.DIRECTOR)) {
            if (int_accion == 1) str_estatus = "RCHZ-DIR";
            else {
                if (bol_VPO) {
                    str_estatus = "PENVPO";
                } else {
                    str_estatus = "AUTORIZADA";
                }
            }
        } else if (str_perfil.equals(Usuario.VPO)) {
            if (int_accion == 1) str_estatus = "RCHZ-VPO";
            else str_estatus = "AUTORIZADA";
        }
        return str_estatus;
    }
    
    /**
     * 
     * @param stmt_status
     * @param int_accion
     * @param str_perfil
     * @param bol_director
     * @param bol_VPO
     * @return
     * @throws SQLException
     */
    public static int statusSiguiente( Statement stmt_status, int int_accion, String str_perfil, boolean bol_director, boolean bol_VPO ) throws SQLException {
    	int int_retVal = -1;
        String str_estatus = codigoStatusSiguiente( int_accion, str_perfil, bol_director, bol_VPO );
        int_retVal = Estatus.obtenerIdEstatus(stmt_status, str_estatus);
        
        
        return int_retVal;
    }
    
    /**
     * 
     * @param stmt_obtenerId
     * @param str_codigo
     * @return
     * @throws SQLException
     */
    private static int obtenerIdEstatus( Statement stmt_obtenerId, String str_codigo )throws SQLException{
        int int_retVal = -1;
        String str_obtenerId =
            " select id_estatus "+
            " from   ep_estatus " +
            " where  codigo_estatus = '"+str_codigo+"' ";
        ResultSet rs_obtenerId = stmt_obtenerId.executeQuery(str_obtenerId);
        if( rs_obtenerId.next() ){
           int_retVal = rs_obtenerId.getInt("id_estatus");
        }
        rs_obtenerId.close();
        stmt_obtenerId.close();
        return int_retVal;
    }
    
    /**
     * 
     * @param stmt
     * @param str_idEstatus
     * @return
     * @throws SQLException
     */
    public ArrayList listarEstatus(Statement stmt, String str_idEstatus) throws SQLException {
        ArrayList arr_estatus = new ArrayList();
        String str_query = " SELECT es.id_estatus, " +
                           "        es.codigo_estatus, " +
                           "        es.descripcion_estatus, " +
                           "        CASE " +
                           "             WHEN es.id_estatus in(SELECT DISTINCT id_estatus " +
                           "                                          FROM ep_detalleSolicitud " +
                           "                                   WHERE id_estatus=es.id_estatus) then 1  " +
                           "             ELSE 0 " +
                           "        END borrar_estatus, " +
                           "        es.deNuevo_Estatus "+
                           " FROM ep_estatus es ";
        if(!str_idEstatus.equals(""))
            str_query += " WHERE es.id_estatus = '"+ str_idEstatus +"' ";

        ResultSet rs = stmt.executeQuery(str_query);

        boolean bool_fila = false;
        while(rs.next()){
            str_idEstatus = rs.getString("id_estatus");
            String str_codEstatus = rs.getString("codigo_estatus");
            String str_descEstatus = rs.getString("descripcion_estatus");
            String str_delEstatus = rs.getString("borrar_estatus");
            String str_deNuevo = rs.getString("deNuevo_Estatus");

            Map map_urlEliminar = new HashMap();
            Map map_urlActualizar = new HashMap();

            map_urlEliminar = mapa_editarMapa(str_idEstatus , ELIMINAR);
            map_urlActualizar = mapa_editarMapa(str_idEstatus , EDITAR);

            EstatusBean bn_estatus = new EstatusBean();
            bn_estatus.setStr_idEstatus(str_idEstatus);
            bn_estatus.setStr_codEstatus(str_codEstatus);
            bn_estatus.setStr_descEstatus(str_descEstatus);
            bn_estatus.setStr_delEstatus(str_delEstatus);
            bn_estatus.setMap_urlEliminar(map_urlEliminar);
            bn_estatus.setMap_urlActualizar(map_urlActualizar);
            bn_estatus.setBool_fila(bool_fila);
            bn_estatus.setStr_deNuevo_Estatus(str_deNuevo);

            bool_fila = !bool_fila;
            arr_estatus.add(bn_estatus);
        }

        return arr_estatus;
    }


    /**
     * 
     * @param stmt
     * @param mapa_estatus
     * @return
     * @throws SQLException
     */
    public boolean insertarEstatus(Statement stmt, Map mapa_estatus) throws
            SQLException {
        String str_codEstatus  = (String)mapa_estatus.get("str_codEstatus");
        String str_descEstatus = (String)mapa_estatus.get("str_descEstatus");
        String str_deNuevo = (String)mapa_estatus.get("str_deNueva");
        boolean bool_insertar  = validaEstatus(stmt, str_codEstatus, "");

        if(bool_insertar){
            stmt.clearBatch();
            String str_query = "INSERT INTO ep_estatus(	codigo_estatus,     " +
                               "                        descripcion_estatus, " +
                               "                        deNuevo_estatus)    " +
                               "VALUES('"+str_codEstatus+"', '"+str_descEstatus+"', '"+str_deNuevo+"')";
            stmt.executeUpdate(str_query);
            return bool_insertar;
        }
        return bool_insertar;
    }


    /**
     * 
     * 
     * @param stmt
     * @param mapa_estatus
     * @return
     * @throws SQLException
     */
    public boolean actualizaEstatus(Statement stmt, Map mapa_estatus) throws
            SQLException {
        String str_idEstatus = (String)mapa_estatus.get("str_idEstatus");
        String str_codEstatus = (String)mapa_estatus.get("str_codEstatus");
        String str_descEstatus = (String)mapa_estatus.get("str_descEstatus");
        String str_deNuevo = (String)mapa_estatus.get("str_deNueva");

        boolean bool_update = validaEstatus(stmt, str_codEstatus, str_idEstatus);

       if(bool_update){
            stmt.clearBatch();
            String str_query = " UPDATE ep_estatus " +
                               "        SET codigo_estatus = '"+str_codEstatus+"', " +
                               "            descripcion_estatus = '"+ str_descEstatus +"', " +
                               "             deNuevo_estatus = '"+str_deNuevo+"' "+
                               " WHERE id_estatus = '"+ str_idEstatus +"' ";
            stmt.executeUpdate(str_query);
            return bool_update;
        }
        return bool_update;
    }



    public void eliminarEstatus(Statement stmt, String str_idEstatus) throws
            SQLException {
        String str_query = " DELETE FROM ep_estatus " +
                           " WHERE (id_estatus not in (SELECT id_estatus " +
                           "                           FROM ep_detalleSolicitud)) " +
                           "                           AND id_estatus = '"+ str_idEstatus +"' ";
        stmt.executeUpdate(str_query);
    }



    public boolean validaEstatus(Statement stmt, String str_codEstatus, String str_idEstatus) throws
            SQLException {
        String str_query = " SELECT COUNT(*) AS totales" +
                           " FROM ep_estatus " +
                           " WHERE codigo_estatus = '"+ str_codEstatus +"' ";
        if(!str_idEstatus.equals(""))
            str_query += " AND id_estatus != '"+str_idEstatus+"'";

        ResultSet rs = stmt.executeQuery(str_query);
        int int_size = 0;

        while(rs.next()){
            int_size = rs.getInt("totales");
        }
        if(int_size > 0)
            return false;
        else
            return true;
    }

    private Map mapa_editarMapa(String str_idEstatus , String str_accion){
       Map map_url = new HashMap();

       map_url.put("str_idEstatus", str_idEstatus);
       map_url.put("action", str_accion);

       return map_url;
   }
   
    /**
     * 
     * @param stmt_estatusNva
     * @return
     * @throws SQLException
     */
   public static ArrayList estatusNueva( Statement stmt_estatusNva ) throws SQLException{
       ArrayList arrL_retVal = new ArrayList();
       String str_estatusNva =
            " SELECT id_estatus, "+
            "        codigo_estatus + ' - ' + descripcion_estatus AS descripcion " +
            " FROM   ep_estatus "+
            " WHERE  deNuevo_estatus = 1 ";
       if(DEBUG){System.out.println(str_estatusNva);}
       ResultSet rs_estatusNva = stmt_estatusNva.executeQuery(str_estatusNva);
       while( rs_estatusNva.next() ){
           EstatusNva estatus = new EstatusNva();
           estatus.setInt_id(rs_estatusNva.getInt("id_estatus"));
           estatus.setStr_descripcion(rs_estatusNva.getString("descripcion"));
           arrL_retVal.add(estatus);
       }
       rs_estatusNva.close();
       stmt_estatusNva.close();
       return arrL_retVal;
   }
   
   /**
    * Verifica si la clase-producto requiere auttorizacion de director
    * 
    * @param stmt_autroriza
    * @param str_producto
    * @return
    * @throws Exception
    */
   public static boolean autorizaDirector(Statement stmt_autroriza, String str_producto)throws Exception{
	   boolean bool_autoriza = false;
	   String str_query = 
		   " SELECT codigo_clProd,                    " +
		   "        autorizaDireccion_clProd          " +
		   " FROM ep_claseProducto                    " +
		   " INENR JOIN ep_vw_producto                " +
		   "    ON clase_prod = codigo_clProd         " +
		   "  WHERE  codigo_prod = '"+str_producto+"' ";
	   
	   if(DEBUG){System.out.println(str_query);}
	   ResultSet rs = stmt_autroriza.executeQuery(str_query);
	   if(rs.next()){
		   bool_autoriza  = rs.getBoolean("autorizaDireccion_clProd");
	   }
	   return bool_autoriza;
   }
}
